package com.atguigu.lease.web.app.interceptor;

import com.atguigu.lease.common.context.LoginUser;
import com.atguigu.lease.common.context.LoginUserContext;
import com.atguigu.lease.common.exception.StgyException;
import com.atguigu.lease.common.result.ResultCodeEnum;
import com.atguigu.lease.common.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * @Author GQS @Date 2024/9/4/20:18 @Description 身份认证拦截器
 */
@Component
public class AuthenticationInterceptor implements HandlerInterceptor {
    /**
     * 在请求处理之前进行拦截处理
     * 主要用于身份验证和权限预检查
     *
     * @param request  当前的HttpServletRequest对象，用于获取请求信息
     * @param response 当前的HttpServletResponse对象，用于做出响应
     * @param handler  当前请求的处理器对象
     * @return 如果返回false，表示此拦截器拦截请求，不再继续调用其他的拦截器或处理器；
     * 如果返回true，表示继续调用下一个拦截器或处理器
     * @throws Exception 可能抛出的异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取请求头中的token
        String token = request.getHeader("access_token");
        // 判断token是否为空
        if (token == null || token.isEmpty()) {
            // 抛出未授权异常，提示需要登录认证
            throw new StgyException(ResultCodeEnum.APP_LOGIN_AUTH);
        } else {
            // 解析token，获取用户信息
            Claims claims = JwtUtil.parseToken(token);
            // 获取用户ID
            Long userId = claims.get("userId", Long.class);
            // 获取用户名
            String username = claims.get("username", String.class);
            // 设置当前登录用户信息
            LoginUserContext.setLoginUser(new LoginUser(userId, username));
        }
        // 继续执行下一个拦截器或处理器
        return true;
    }

    /**
     * 请求处理完成后执行此方法，用于清理环境或资源
     *
     * @param request  已处理的HttpServletRequest对象
     * @param response 已处理的HttpServletResponse对象
     * @param handler  已处理的处理器对象
     * @param ex       处理过程中可能抛出的异常，如果为null，表示处理成功
     * @throws Exception 可能抛出的异常
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 清理登录用户上下文信息
        LoginUserContext.clear();
    }
}


